from typing import List

from src.day20.case_manage.bug_manage import BugManage
from src.day20.case_manage.testcase import TestCase


class TestCaseManage(object):
    """
    testcases: 一个列表，用于存储所有 Testcase 实例。
    list_testcases(): 返回所有测试用例的数据。
    add_testcase(testcase): 将新的 Testcase 实例添加到 testcases 列表。
    get_testcase(cid): 根据用例编号从 testcases 中查找并返回 Testcase 实例。
    update_testcase(cid, testcase): 根据用例编号更新 testcases 中的 Testcase 实例。
    delete_testcase(cid): 根据用例编号从 testcases 中删除 Testcase 实例。
    search_testcases(module=None, priority=None, bug_id=None): 根据条件搜索测试用例。
    """

    def __init__(self, bug_manage: BugManage):
        self.testcases: List[TestCase] = []
        self.bug_manage = bug_manage

    def list_testcases(self):
        """
        返回所有测试用例的数据。
        :return:
        """
        return self.testcases

    def add_testcase(self, testcase: TestCase):
        """
        将新的 Testcase 实例添加到 testcases 列表。
        :param testcase:
        :return:
        """
        if self.testcase_exist(testcase.cid):
            return f"id为{testcase.cid}的测试用例已经存在"
        if testcase.bug_id and not self.bug_manage.bug_exist(testcase.bug_id):
            return f"case 关联的bug id为{testcase.bug_id}是不存在的"
        self.testcases.append(testcase)

    def get_testcase(self, cid):
        """
        根据用例编号从 testcases 中查找并返回 Testcase 实例。
        :param cid:
        :return:
        """
        for testcase in self.testcases:
            if testcase.cid == cid:
                return testcase

    def update_testcase(self, cid, testcase: TestCase):
        """
        根据用例编号更新 testcases 中的 Testcase 实例。
        :param testcase:
        :return:
        """
        if not self.testcase_exist(cid):
            return f"测试用例{testcase.cid} 不存在"
        if testcase.bug_id and not self.bug_manage.bug_exist(testcase.bug_id):
            return f"case 关联的bug id为{testcase.bug_id}是不存在的"
        for _testcase in self.testcases:
            if _testcase.cid == cid:
                _testcase = testcase

    def delete_testcase(self, cid):
        """
        根据用例编号从 testcases 中删除 Testcase 实例。
        :param cid:
        :return:
        """
        self.testcases = [case for case in self.testcases if case.cid != cid]

    def search_testcases(self, module=None, priority=None, bug_id=None):
        """
        根据条件搜索测试用例。
        :param priority:
        :param bug_id:
        :return:
        """
        if module:
            return [case for case in self.testcases if case.module == module]
        if priority:
            return [case for case in self.testcases if case.priority == priority]
        if bug_id:
            return [case for case in self.testcases if case.bug_id == bug_id]

    def testcase_exist(self, cid):
        return cid in [case.cid for case in self.testcases]
